home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 2: CDPD 1
/
Almathera Ten on Ten - Disc 2: CDPD 1.iso
/
pd
/
201-225
/
214
/
mandelvroom
/
src
/
saveilbm.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-03-13
|
7KB
|
269 lines
/***************************************************************************
* SaveILBM.c -- Save front screen as ILBM file
* Saves a CAMG chunk for Amiga ViewModes
* by Carolyn Scheppner CBM 10/86
*
* modified by Kevin L. Clague for use in Mandelbrot
*
* Using IFF rtns by J.Morrison and S.Shaw of Electronic Arts
*
***************************************************************************/
#include "SaveILBM.h"
/* CAMG Stuff */
typedef struct {
ULONG ViewModes;
} CamgChunk;
#define PutCAMG(context, camg) \
PutCk(context, ID_CAMG, sizeof(CamgChunk), (BYTE *)camg)
#define ID_CRNG MakeID('C','R','N','G')
#define PutCRNG(context, crng) \
PutCk(context, ID_CRNG, sizeof(CrngChunk), (BYTE *)crng)
#define bufSize 512
extern struct IntuitionBase *IntuitionBase;
extern struct Screen *screen;
struct Screen *frontScreen;
struct ViewPort *picViewPort;
struct BitMap *picBitMap;
WORD *picColorTable;
ULONG picViewModes;
/* ILBM Icon Image */
USHORT ILBMimagedata[] = {
0x0000, 0x0000, 0x0000, 0x0000,
0x7FFF, 0xFFFF, 0xFFFF, 0xFF80,
0x6000, 0x0000, 0x0000, 0x0180,
0x6000, 0x07FF, 0xFFFF, 0x8180,
0x6000, 0x401F, 0xFFC0, 0x0180,
0x6002, 0xE000, 0x0000, 0x0180,
0x6003, 0x6002, 0x0008, 0x0180,
0x600B, 0xF807, 0x005E, 0x0180,
0x6001, 0xFC03, 0x809F, 0x8180,
0x6000, 0x0E07, 0xC2FF, 0xE180,
0x600D, 0xAF05, 0xE017, 0xF980,
0x6021, 0x2F83, 0xC057, 0xF980,
0x6025, 0xFF1F, 0x24C7, 0xF980,
0x6097, 0xFA6E, 0x881F, 0xF980,
0x601E, 0xFCEC, 0x3B5B, 0xF980,
0x6055, 0xFFBA, 0x559F, 0xF980,
0x60EF, 0xFFFF, 0xFFFF, 0xF980,
0x6000, 0x0000, 0x0000, 0x0180,
0x7FFF, 0xFFFF, 0xFFFF, 0xFF80,
0x0000, 0x0000, 0x0000, 0x0000,
/**/
0xFFFF, 0xFFFF, 0xFFFF, 0xFFC0,
0x8000, 0x0000, 0x0000, 0x0040,
0x9FFF, 0xFFFF, 0xFFFF, 0xFE40,
0x9800, 0x0000, 0x0000, 0x0640,
0x9800, 0x0000, 0x0000, 0x0640,
0x9801, 0x0000, 0x0000, 0x0640,
0x9804, 0x8004, 0x0000, 0x0640,
0x9804, 0x8008, 0x0020, 0x0640,
0x981F, 0x0C0C, 0x0160, 0x0640,
0x983F, 0xFE1F, 0x8D00, 0x0640,
0x98FF, 0xFF7F, 0xDFE8, 0x0640,
0x9BFF, 0xFFFF, 0xFFFF, 0x0640,
0x9FFF, 0xFFFF, 0xFFFF, 0x8640,
0x9FFF, 0xFFFF, 0xFFFF, 0xFE40,
0x9FFF, 0xFFFF, 0xFFFF, 0xFE40,
0x9FFF, 0xFFFF, 0xFFFF, 0xFE40,
0x9FFF, 0xFFFF, 0xFFFF, 0xFE40,
0x9FFF, 0xFFFF, 0xFFFF, 0xFE40,
0x8000, 0x0000, 0x0000, 0x0040,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFC0
/**/
};
struct Image ILBMimage[] = {
0, /* LeftEdge */
0, /* TopEdge */
58, /* Width */
20, /* Height */
2, /* Depth */
(USHORT *)&ILBMimagedata, /* ImageData */
0x3, /* PlanePick */
0x0, /* PlaneOnOff */
0 /* [NextImage] */
};
struct DiskObject ILBMIcon = {
WB_DISKMAGIC, /* do_Magic */
WB_DISKVERSION, /* do_Version */
/* Embedded Gadget Structure */
0, /* [NextGadget] */
147, /* LeftEdge */
23, /* TopEdge */
58, /* Width */
20, /* Height */
0x4, /* Flags */
0x3, /* Activation */
0x1, /* GadgetType */
(APTR)&ILBMimage, /* GadgetRender */
NULL, /* SelectRender */
NULL, /* GadgetText */
0x0, /* MutualExclude */
0x0, /* [SpecialInfo] */
0, /* GadgetID */
0x0, /* [UserData] */
/* Rest of DiskObject structure */
0x4, /* do_Type */
":ViewILBM", /* do_Default Tool */
0xC06508, /* [do_ToolTypes] */
NO_ICON_POSITION, /* do_CurrentX */
NO_ICON_POSITION, /* do_CurrentY */
0x0, /* [do_DrawerData] */
0x0, /* [do_ToolWindow] */
0x0 /* do_StackSize */
};
/**************************************************************************
*
* Save the current screen as an ILBM file
*
**************************************************************************/
SaveILBM(FileName, Crng, numCrng)
char *FileName;
CrngChunk *Crng;
int numCrng;
{
LONG file;
IFFP iffp = NO_FILE;
int l;
if (!(file = Open(FileName, MODE_NEWFILE))) {
char Msg[80];
sprintf(Msg,"Can't open file %s\n",FileName);
DispErrMsg(Msg,0);
return(0);
}
Write(file,"x",1); /* 1.1 so Seek to beginning works ? */
frontScreen = screen;
picViewPort = &( frontScreen->ViewPort );
picBitMap = (struct BitMap*)picViewPort->RasInfo->BitMap;
picColorTable = (WORD *)picViewPort->ColorMap->ColorTable;
picViewModes = (ULONG)picViewPort->Modes;
iffp = PutPicture(file, picBitMap, picColorTable, picViewModes,
Crng, numCrng);
Close(file);
if (iffp == IFF_OKAY && FromWB ) {
/* This line outputs the icon */
PutDiskObject(FileName,&ILBMIcon);
}
} /* SaveILBM */
/** PutPicture() ***********************************************************
*
* Put a picture into an IFF file.
* This procedure calls PutAnILBM, passing in an <x, y> location of <0, 0>,
* a NULL mask, and a locally-allocated buffer. It also assumes you want to
* write out all the bitplanes in the BitMap.
*
***************************************************************************/
Point2D nullPoint = {0, 0};
IFFP PutPicture(file, bitmap, colorMap, viewmodes, crng, numcrng)
LONG file; struct BitMap *bitmap;
WORD *colorMap; ULONG viewmodes;
CrngChunk *crng;
int numcrng;
{
BYTE buffer[bufSize];
return( PutAnILBM(file, bitmap, NULL,
colorMap, bitmap->Depth, viewmodes,
&nullPoint, crng, numcrng, buffer, bufSize) );
}
/** PutAnILBM() ************************************************************
*
* Write an entire BitMap as a FORM ILBM in an IFF file.
* This version works for any display mode (C. Scheppner).
*
* Normal return result is IFF_OKAY.
*
* The utility program IFFCheck would print the following outline of the
* resulting file:
*
* FORM ILBM
* BMHD
* CAMG
* CMAP
* CRNG
* CRNG
* CRNG
* CRNG
* BODY (compressed)
*
***************************************************************************/
#define CkErr(expression) {if (ifferr == IFF_OKAY) ifferr = (expression);}
IFFP PutAnILBM(file, bitmap, mask, colorMap, depth,
viewmodes, xy, crng, numcrng,
buffer, bufsize)
LONG file;
struct BitMap *bitmap;
BYTE *mask; WORD *colorMap; UBYTE depth;
ULONG viewmodes;
Point2D *xy; BYTE *buffer; LONG bufsize;
CrngChunk *crng;
int numcrng;
{
BitMapHeader bmHdr;
CamgChunk camgChunk;
GroupContext fileContext, formContext;
IFFP ifferr;
WORD pageWidth, pageHeight;
int i;
pageWidth = (bitmap->BytesPerRow) << 3;
pageHeight = bitmap->Rows;
ifferr = InitBMHdr(&bmHdr, bitmap, mskNone,
cmpByteRun1, 0, pageWidth, pageHeight);
/* You could write an uncompressed image by passing cmpNone instead
* of cmpByteRun1 to InitBMHdr. */
bmHdr.nPlanes = depth; /* This must be <= bitmap->Depth */
if (mask != NULL) bmHdr.masking = mskHasMask;
bmHdr.x = xy->x; bmHdr.y = xy->y;
camgChunk.ViewModes = viewmodes;
CkErr( OpenWIFF(file, &fileContext, szNotYetKnown) );
CkErr(StartWGroup(&fileContext, FORM, szNotYetKnown, ID_ILBM, &formContext));
CkErr( PutBMHD(&formContext, &bmHdr) );
CkErr( PutCAMG(&formContext, &camgChunk) );
CkErr( PutCMAP(&formContext, colorMap, depth) );
for (i = 0; i < numcrng; i++) {
CkErr( PutCRNG(&formContext, &crng[i]));
}
CkErr( PutBODY(&formContext, bitmap, mask, &bmHdr, buffer, bufsize) );
CkErr( EndWGroup(&formContext) );
CkErr( CloseWGroup(&fileContext) );
return( ifferr );
}